home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / happysrc / pcmain.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  7.5 KB  |  210 lines

  1. /************************************************
  2.  *                                              *
  3.  *       ***************************            *
  4.  *       *  HAPPy Pascal Compiler  *            *
  5.  *       ***************************            *
  6.  * ( HAPPy = H.Asano Pascal Processing system ) *
  7.  *                                              *
  8.  *     Original program                         *
  9.  *             ---  Pascal P4 ---               *
  10.  *                                              *
  11.  *     Pascal-P4は、public domainらしい。        *
  12.  *     このHAPPyの著作権は浅野比富美にある      *
  13.  *     HAPPyは、Pascal-p4のソースをもとに、     *
  14.  *     アルゴリズムにたちかえって解析し、       *
  15.  *     PascalからC言語に書換え、ISO7185規格に    *
  16.  *     準拠させるため、独自の創作を加えたもの   *
  17.  *     である。                                  *
  18.  *                                              *
  19.  *        Copyright(c) H.Asano. 1992.           *
  20.  *           All rights resereved.              *
  21.  *                                              *
  22.  ************************************************/
  23.  
  24. #define EXTERN                          /* pascomp.hで使用            */
  25.  
  26. #define error     1                     /* usage関数への引数          */
  27. #define normal    0                     /* usage関数への引数          */
  28.  
  29. #define NormalEnd     0                 /* 正常終了の終了コード       */
  30. #define CompileError  1                 /* コンパイルエラーの終了コード*/
  31. #define EtcError      2                 /* その他のエラーの終了コード */
  32.  
  33. #include <stdio.h>
  34. #include <string.h>
  35. #include <process.h>
  36. #include <stdlib.h>
  37. #include <ctype.h>
  38. #include "version.h"
  39. #include "pascomp.h"
  40.  
  41. extern void init(void) ;
  42. extern void insymbol(void);
  43. extern void programme(void);
  44.  
  45. void term(void) ;
  46.  
  47. static void argment(int,char**) ;
  48. static void usage(int)         ;
  49.  
  50. FILE *passource ;                       /* pascalソースファイルポインタ */
  51. FILE *pcdfile   ;                       /* P-codeソースファイルポインタ */
  52.  
  53. static char *asm = "PA.OVL" ;           /* アセンブラのファイル名       */
  54. static char *TempPath       ;           /* 環境変数 TMP の 設定内容     */
  55. static char *PcodeSourceName = "pcode.pcs" ;  /* P-codeソースファイル名 */ 
  56. static char PcodeSname[30]    ;        /* P-codeソースファイル名        */
  57. static char drive[3] ;
  58. static char dir[31] ;
  59. static char fname[9] ;
  60. static char ext[4] ;
  61.  
  62. static boolean asmlst = false  ;
  63.  
  64. /**************************************/
  65. /*       main() : メイン処理          */
  66. /**************************************/
  67. void main(int argc,char *argv[])
  68. {
  69.   
  70.     fprintf(stderr,
  71.  "HAPPy Pascal Compiler Version %s  Copyright (c) H.Asano 1992\n",version) ;
  72.     
  73.     argment(argc,argv) ;                /* 起動アーギュメント処理     */
  74.     
  75.     init();                             /* compiler 初期設定処理      */
  76.         
  77.     insymbol();                         /* 最初のsymbolを読む         */
  78.     programme();                        /* programのコンパイル        */
  79.  
  80.     term() ;                            /* 終了処理                   */
  81. }
  82.  
  83. /**************************************/
  84. /* argment() : 起動アーギュメント処理 */
  85. /**************************************/
  86. static void argment(int argc,char *argv[])
  87. {
  88.   int  j  ;
  89.   boolean getfileflag = false ;
  90.  
  91.     if(argc < 2)  usage(normal);        /* アーギュメントなしの時はusage*/ 
  92.  
  93.     _splitpath(argv[0],drive,dir,fname,ext) ; /* コマンド名の分解     */
  94.     TempPath = getenv("TMP") ;          /* 環境変数 TMP を取得        */
  95.     pcode = true  ;                     /* Pコード出力要(デフォルト)      */
  96.     pcdinf= false ;                     /* Pコード情報出力不要(デフォルト)*/
  97.     debug = false ;                     /* 範囲チェック不要(デフォルト)   */
  98.     while(--argc) {
  99.      if(getfileflag) {
  100.        usage(error);                    /* ソースファイル名以降に     */
  101.        break ;                          /* アーギュメントがある場合   */
  102.      }
  103.      if(**++argv == '-') {
  104.       for(j=1;*(*argv+j)!='\0';j++) {
  105.        switch(tolower(*(*argv+j))) {    /* 大文字の時は小文字に変換   */
  106.         case 'c' : pcode  = false ;
  107.                    break          ;
  108.         case 'a' : pcode  = true  ;
  109.                    pcdinf = true  ;
  110.                    asmlst = true  ;
  111.                    break          ;
  112.         case 'd' : debug  = true  ;
  113.                    break          ;
  114.         default  : usage(error)   ;
  115.        }           
  116.       }
  117.       if(j==1)  usage(error);           /* - だけの時はusage          */
  118.      }
  119.      else {
  120.       getfileflag = true ;
  121.       passname  = *argv++;
  122.      }
  123.     }
  124.  
  125.     if(getfileflag) {                   /* ファイル名が指定された時   */ 
  126.      passource = fopen(passname,"r");
  127.      if(passource == NULL) {
  128.       fprintf(stderr,"C002: Pascalソースファイル(%s)がない\n", passname);
  129.       exit(EtcError);
  130.      } 
  131.     }
  132.     else usage(error) ;                 /* ファイル名の指定がない時   */
  133.  
  134.     if(pcode) {
  135.      strcpy(PcodeSname,TempPath) ;
  136.      strcat(PcodeSname,PcodeSourceName) ;
  137.      pcdfile = fopen(PcodeSname,"w");
  138.      if(pcdfile == NULL) {
  139.       fprintf(stderr,"C003: P-codeソースファイル(%s)が作れない\n",PcodeSname) ;
  140.       exit(EtcError);
  141.      }
  142.     }
  143. }
  144.  
  145. /**************************************/
  146. /*    usage() : 使用方法出力処理      */
  147. /**************************************/
  148. static void usage(int type)
  149. {
  150. if(type == error) 
  151.  fputs("\nC001: 起動パラメータが誤っている\n",stderr);
  152. else {
  153.  fputs("\n  HAPPy is the H.Asano Pascal Processing system. (^_^)\n",
  154.              stderr);
  155.  fputs(
  156.   "\n  HAPPyはISO7185規格水準0にほぼ準拠したMS-DOS汎用Pascal処理系です。\n",
  157.            stderr) ;
  158.  fputs("  HAPPyの複写・再配付は自由です。\n", stderr) ;
  159. }
  160.  
  161. fputs("\n  pcコマンドはPascalソースからカレントディレクトリにP-codeオブジェクト(pcode.pco)を\n",
  162.          stderr);
  163. fputs("  作ります。できたオブジェクトはpiコマンドで実行させます。\n\n",stderr);
  164.  
  165.      fputs("  使い方:  pc [ オプション... ] Pascalソースファイル名\n",stderr) ;
  166.  
  167.      fputs("  オプション:\n",stderr);
  168.      fputs("     -c ・・・ 構文チェックのみ行う\n",stderr);
  169.      fputs("     -a ・・・ アセンブルリストを標準出力に出力する\n",stderr);
  170.      fputs("     -d ・・・ 範囲チェック等を行うコードを生成する\n",stderr);
  171.  
  172.      exit(EtcError);                    /* その他のエラーで終了       */
  173. }
  174.  
  175. /***************************************/
  176. /*         term() : 終了処理           */
  177. /***************************************/
  178. void term(void)
  179. {
  180.   int resultcode ;
  181.   char instsize[7]  ;
  182.  
  183.     if(pcode && (errorcount == 0)) {
  184.      fputs(" *** Compile  completed. ***\n",stderr) ;
  185.      fclose(pcdfile) ;
  186.      sprintf(instsize,"%d",ic) ;
  187.      if(asmlst) 
  188.       resultcode=execl(strcat(strcat(drive,dir),asm),"",
  189.                        instsize,PcodeSname,version,"l",NULL);
  190.                                                  /* アセンブルリスト付*/  
  191.      else
  192.       resultcode=execl(strcat(strcat(drive,dir),asm),"",
  193.                        instsize,PcodeSname,version,NULL) ;
  194.                                                  /* 通常のアセンブル  */
  195.      if(resultcode == -1) {             /* アセンブラが起動できない   */
  196.       fprintf(stderr,"C004: アセンブラ(%s)が起動できない\n",asm) ;
  197.       exit(EtcError) ;
  198.      }
  199.     } 
  200.     else if(errorcount != 0) {
  201.      fprintf(stderr," *** %d errors detected. Fail in compile ***\n",
  202.                       errorcount);
  203.     exit(CompileError) ;
  204.     }                  
  205.     else {                              /* pcode = false              */
  206.      fputs("*** No Error ***\n",stderr);
  207.      exit(NormalEnd) ;
  208.     }  
  209. }
  210.